package com.example;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.Getter;
import lombok.Setter;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;
import java.util.List;

@SpringBootTest
public class JsonUtilTest {

    // JSONUtil 是针对 JSONObject 和 JSONArray 的静态快捷方法集合，

    @Test
    public void test() {
        // 创建JSON对象
        JSONObject json1 = JSONUtil.createObj()
                .append("name", "John")
                .append("age", 30)
                .append("city", "New York");

        // JSON字符串解析
        String jsonStr = "{\"b\":\"value2\",\"c\":\"value3\",\"a\":\"value1\"}";
        // 方法一：使用工具类转换
        JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
        System.out.println(jsonObject);

        // 将 JSONObject 转换为具体 Bean
        User bean = JSONUtil.toBean(jsonObject, User.class);
        System.out.println(bean);

        // 第二个参数为是否保持有序
        JSONObject jsonObject1 = JSONUtil.parseObj(jsonStr, true);
        // 格式化后的JSON，即显示出带缩进的JSON
        String jsonPrettyStr = JSONUtil.toJsonPrettyStr(jsonStr);
        System.out.println(jsonPrettyStr);
    }


    @Test
    public void test1() {
        // 创建JSON数组
        JSONArray array = JSONUtil.createArray();
        // 方法2
        // JSONArray array1 = new JSONArray();
        array.add("value1");
        array.add("value2");
        array.add("value3");

        // JSONUtil.toJsonStr可以将任意对象（Bean、Map、集合等）直接转换为JSON字符串。 如果对象是有序的Map等对象，则转换后的JSON字符串也是有序的。
        // 转为JSONArray字符串
        String list = JSONUtil.toJsonStr(array);
        System.out.println(list);

        // 从 JSON 字符串解析
        String jsonStr = "[\"value1\", \"value2\", \"value3\"]";
        JSONArray array2 = JSONUtil.parseArray(jsonStr);
        System.out.println(array2);

        // JSON字符串解析并转换为bean的List
        String jsonArr = "[{\"id\":111,\"name\":\"test1\"},{\"id\":112,\"name\":\"test2\"}]";
        JSONArray array3 = JSONUtil.parseArray(jsonArr);

        // 将 JSONArray 转换为具体 Bean 的 List 集合
        List<User> userList = JSONUtil.toList(array3, User.class);
        userList.forEach(System.out::println);

        JSONArray jsonArray = JSONUtil.parseArray(list);
        System.out.println(jsonArray);
    }

    @Test
    public void test2() {
        // 读取 JSON 文件并解析为 JSONObject
        JSONObject jsonObject = JSONUtil.readJSONObject(new File("D:\\test.json"), CharsetUtil.CHARSET_UTF_8);
        String jsonPrettyStr = JSONUtil.toJsonPrettyStr(jsonObject);
        System.out.println(jsonPrettyStr);
        // 将 JSONObject 转换为具体 Bean
        User bean = JSONUtil.toBean(jsonObject, User.class);
        System.out.println(bean);

        // 读取 JSON 文件并解析为 JSONArray
        JSONArray jsonArray = JSONUtil.readJSONArray(new File("D:\\test.json"), CharsetUtil.CHARSET_UTF_8);
        // 将 JSONArray 转换为具体 Bean 的 List 集合
        List<User> list = JSONUtil.toList(jsonArray, User.class);
        System.out.println(list);
    }

    @Getter
    @Setter
    static class User {
        private Integer id;
        private String name;
    }
}
